package com.itheima.controller;

import com.itheima.anno.Log;
import com.itheima.pojo.*;
import com.itheima.service.EmpService;
import com.itheima.util.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {

    // 控制器拥有业务层
    @Autowired
    private EmpService empService;

    /**
     * 浏览器发送请求: /emps?page=1&pageSize=10
     * 查询所有员工信息 (基本查询)
     * @return
     */
    @GetMapping
    public Result list(EmpQueryParam param) {
        log.info("name = {}, gender = {}, begin = {}, end = {}, page = {}, pageSize = {}",
                param.getName(), param.getGender(), param.getBegin(), param.getEnd(), param.getPage(), param.getPageSize());
        // 调用业务层 查询所有员工信息,
        // 给方法添加参数: 光标在红色波浪线地方, alt + 回车 -> Change signature of list(Integer, Integer)
        PageBean pageBean = empService.list(param);

        // 响应结果
        return Result.success(pageBean);
    }

    /**
     * 添加员工信息
     * @RequestBody: 1.获取请求体的JSON数据 2.把JSON转成Java对象
     * @param emp
     * @return
     */
    @Log
    @PostMapping
    public Result save(@RequestBody Emp emp) throws FileNotFoundException {
        log.info("emp = {}", emp);

        // 调用业务层添加员工
        empService.save(emp);

        // 响应结果
        return Result.success();
    }

    /**
     * 根据id批量删除
     * 浏览器发送 /emps/ids=1,2,3    两种接收方式: (Integer[] ids)     (@RequestParam List<Integer> ids)
     * @param ids
     * @return
     */
    @Log
    @DeleteMapping
    public Result delete(Integer[] ids) {
        log.info("ids = {}", Arrays.toString(ids));

        // 调用业务层删除员工
        empService.delete(ids);

        return Result.success();
    }

    /**
     * 根据id查询员工基本信息和工作经历
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        log.info("getById: id = {}", id);

        // 调用业务层查询员工和经历
        Emp emp = empService.getById(id);

        // 响应数据
        return Result.success(emp);
    }

    /**
     * 修改员工基本信息和工作经历
     * @param emp
     * @return
     */
    @Log
    @PutMapping
    public Result update(@RequestBody Emp emp) {
        log.info("update: emp = {}", emp);
        // 调用业务层修改员工基本信息和工作经历
        empService.update(emp);
        return Result.success();
    }

    @GetMapping("/list")
    public Result getEmpList() {
        return Result.success(empService.getEmpList());
    }

    // TODO: 俩种实现：解析 token 或者用 token 查表
    @PutMapping("/changePassword")
    public Result modifyPassword(@RequestHeader String token, @RequestBody EmpModifyPasswordParam empModifyPasswordParam) {
        Claims claims = JwtUtils.parseJWT(token);
        Integer empId = (Integer) claims.get("id");
        empModifyPasswordParam.setToken(token);
        empService.modifyPassword(empId, empModifyPasswordParam);
        log.info("员工修改密码: id={}, {}", empId, empModifyPasswordParam);
        return Result.success();
    }
}
